﻿/**
* Контейнер для изображений, используется только в связке с классом SlideShow
* @author Firsoff Maxim, ICQ:235859730, email: firsoff_maxim@mail.ru
* @version 0.1/13.02.2008 13:18
* @since Action Script 3.0
*/

package ru.vega_int.firsoff.as3.slideshow 
{
	import classes.SiteEvents;
	import flash.display.Sprite;
	import flash.errors.IllegalOperationError;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import ru.vega_int.firsoff.as3.slideshow.*;
	import ru.vega_int.firsoff.as3.events.*;
	import ru.vega_int.firsoff.as3.ImageViewer;
	
	public class SlideShowContainer extends Sprite
	{
		//	PROPERTIES
		//	private 
		private var _height:Number;				//	высота для заливки контенера
		private var _width:Number;				//	ширина для заливки контенера
		private var _fadeTime:Number;			//	время фейдинга
		private var _fadeStep:Number;			//	шаг фейдинга (я привязал к enter frame как самое безглючное)
		private var _url:String;				//	ссылка на файл
		private var _state:String;				//	состояние контейнера
		private var _id:Number;					//	уникальный идентификатор
		private var _imageViewer:ImageViewer;	//	вьювер
		private var fade:String;				//	направление фейдинга IN/OUT
		//	public
	
		/**
		 * Конструктор
		 * @param	width	Ширина
		 * @param	height	Высота
		 */
		public function SlideShowContainer(width:Number, height:Number)
		{
			this._width = width;
			this._height = height;
			init();
		};
		
		// METHODS
		private function init():void
		{
			_state = SlideShowContainerStates.EMPTY;
			this.cacheAsBitmap = true;
			drawArea();
		};
		
		/**
		 * Отрисовка фона, это нужно для Image Viewer
		 */
		private function drawArea():void
		{
			this.graphics.beginFill(0xCCCCCC, 0);
			this.graphics.drawRect(0,0,_width,_height);
		};
		
		/**
		 * Установка обработчиков событий
		 */
		private function setHandlers():void
		{
			if(_imageViewer)
			{
				//trace('setHandlers')
				_imageViewer.addEventListener(ImageViewerEvent.ON_ERROR, errorHandler);
				_imageViewer.addEventListener(ProgressEvent.PROGRESS, progressHandler);
				_imageViewer.addEventListener(ImageViewerEvent.ON_INIT, completeHandler);
			};
		};
		
		/**
		 * Удаление обработчиков событий
		 */
		private function removeHandlers():void
		{
			if(_imageViewer)
			{
				_imageViewer.removeEventListener(ImageViewerEvent.ON_ERROR, errorHandler);
				_imageViewer.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
				_imageViewer.removeEventListener(ImageViewerEvent.ON_INIT, completeHandler);
			}
		};
		
		/**
		 * Расчет шага фейдинга
		 * @param	time	Нужное время в секундах
		 */
		public function setFadeTime(time:Number):void
		{
			var fps:uint = this.stage.frameRate;
			_fadeStep = 1/(time * fps);
			
			//trace(time)
		};
		
		/**
		 * Загрузка файла, присвоение идентфикатора обязательно
		 * @param	url	Ссылка на файл
		 * @param	id	Идентификатор
		 */
		public function load(url:String, id:Number=0):void
		{
			trace('load : ' + url)
			this.id = id;
			this._url = url;
			closeStream();				//	закрываем на всякий случай поток
			state = SlideShowContainerStates.LOADING;
			removeHandlers();			//	удаляем всех обработчиков
			_imageViewer = new ImageViewer(this, url, this._width, this._height, "C", false, null, false, 0, true, true);
			this.alpha = 0;				//	обнуляем
			setHandlers();				//	настраиваем обработчики
			_imageViewer.load();
		};
		
		/**
		 * Закрывает поток загрузки
		 */
		public function closeStream():void
		{
			state = SlideShowContainerStates.EMPTY;		//	выставляем флаг
			try {_imageViewer.destroy()} 
			catch (error:Error) {/*trace('no loading stream');*/};
		};
		
		
		public function hide():void
		{
			this.removeEventListener(Event.ENTER_FRAME, fadeHandler);
			fade = 'OUT';
			this.addEventListener(Event.ENTER_FRAME, fadeHandler);
		};
		
		public function show():void
		{
			this.removeEventListener(Event.ENTER_FRAME, fadeHandler);
			fade = 'IN';
			this.addEventListener(Event.ENTER_FRAME, fadeHandler);
		};
		
		/**
		 * Уничтожение контента
		 */
		public function destroy():void
		{
			closeStream();
			this.graphics.clear();
			removeHandlers();
			this.state = SlideShowContainerStates.EMPTY;
		};
		
		
		// HANDLERS
		
		/**
		 * Обработчик enter frame
		 */
		private function fadeHandler(e:Event):void
		{
			if(fade == 'IN')
			{
			
				if(this.alpha < 1)
				{
					this.alpha += _fadeStep;
				}
				else
				{
					this.alpha = 1;
					this.removeEventListener(Event.ENTER_FRAME, fadeHandler);
					this.dispatchEvent(new SlideShowContainerEvents(SlideShowContainerEvents.SHOW));
				};
				//
			}
			else
			{
				//trace(this.alpha);
				if(this.alpha > 0)
				{
					this.alpha -= _fadeStep;
				}
				else
				{
					this.alpha = 0;
					this.removeEventListener(Event.ENTER_FRAME, fadeHandler);
					this.dispatchEvent(new SlideShowContainerEvents(SlideShowContainerEvents.HIDE));
				};
			};
		};
		
		/**
		 * При ошибке загрузки файла
		 * @param	e
		 */
		private function errorHandler(e:ImageViewerEvent):void
		{
			trace('errorHandler : '+ url);
			this.state = SlideShowContainerStates.ERROR;
			this.dispatchEvent(new SlideShowContainerEvents(SlideShowContainerEvents.ERROR));
			this.state = SlideShowContainerStates.EMPTY;
		};
		
		/**
		 * ПРи прогрессе загрузки
		 * @param	e
		 */
		private function progressHandler(e:ProgressEvent):void
		{
			//trace('progressHandler')
			this.dispatchEvent(e);
		};
		
		/**
		 * ПРи окончании загрузки
		 * @param	e
		 */
		private function completeHandler(e:ImageViewerEvent):void
		{
			trace('completeHandler : '+ url);
			this.state = SlideShowContainerStates.COMPLETE;
			this.dispatchEvent(new SlideShowContainerEvents(SlideShowContainerEvents.LOAD));
		};
		// SETTERS/GETTERS
		
		public function get url():String{return _url;};
		
		public function get fadeTime():Number{return _fadeTime;};
		public function set fadeTime(time:Number):void
		{
			_fadeTime = Math.abs(time)
			
		};
		
		public function get state():String{return _state;};
		public function set state(s:String):void
		{
			if(SlideShowContainerStates.check(s))
			{
				_state = s;
			}
			else
			{
				throw new IllegalOperationError('State "'+s+'" are not supported');
			};
		};
		
		public function set id(i:Number):void{_id = i;};
		public function get id():Number{return _id;};
	};
	
};
